import axios from 'axios'
import { ElMessage } from 'element-plus'
import { getToken, getTimeStamp, removeTimeStamp } from '@/utils/auth'

const instance = axios.create({
	baseURL: 'http://localhost:8080', //请求路径
	timeout: 50000 //超时报错
})
// 定义一个过期时间
// 30分钟的过期时间
const timeOut = 30 * 60 * 1000
// 测试时间：10s
// const timeOut = 10 * 1000
instance.interceptors.request.use(
	(config) => {
		// 统一给所有的请求设置 token
		// 得到 token 的保存时间
		const tokeTime = getTimeStamp()!
		// 得到当前时间与 token 保存时间之间的间隔
		const space = Date.now() - Number(tokeTime)
		// 判断时间间隔是否超过了过期时间
		if (space >= timeOut) {
			// 说明已经过期
			// 清除了 token
			// 清除时间
			removeTimeStamp()
			// 跳转到登录页面
			// 提示信息
			ElMessage.error('token 过期了')
			return Promise.reject(new Error('token 过期了'))
		}
		const token: string | undefined = getToken()
		if (token) {
			config.headers.Authorization = token
		}
		return config
	},
	(error) => {
		return Promise.reject(error)
	}
)
instance.interceptors.response.use(
	(response) => {
		// response 中包含了服务器响应回来的内容，包含在 data 属性中
		// 统一处理参数出错的情况
		const { message, success } = response.data
		// 判断当前请求是否出错
		if (success) {
			// 返回数据
			return response.data
		} else {
			// 提示错误信息
			return Promise.reject(new Error(message))
		}
	},
	(error) => {
		if (error.response.status == 401) {
			ElMessage.error('token失效了')
		} else {
			ElMessage.error('服务器请求错误，请稍后再试')
		}
		// 1.0 删除失效的 token
		// 2.0 跳转到登录页面
		// 3.0 提示错误信息
		return Promise.reject(error)
	}
)
//  封装一个通用的函数来发请求
// 使用的方式：
// request('地址',请求方式, 本次请求携带的参数) ===> 返回结果
function request(url: string, method: string, queryData: any) {
	return instance({
		url: url,
		method: method,
		// 对method做判断前的处理-->转成全小写，再判断
		// 属性名前后添加[]，表示动态的属性名，[]里面可以写表达式
		[method.toLowerCase() === 'get' ? 'params' : 'data']: queryData
	})
}

export default request
